% makeTruthTable (n)
% ==================
% Crea una matriz 'table' de pruebas, que en conjunto se la
% denomica 'epoca' cada fila representa una prueba para una 
% 'neurona' de perseptron simple

% Se preprosesan los valores:
% los valores de verdad son 1 y -1 siendo -1 falso, y 1 verdadero

% Parametros:
% n - representa la cantidad de entradas de la neurona, 
% su dimension

% NOTAS:
% (*) Los indices en Octave comienzan desde 1 !!!
% (*) Antes de acceder una variable global hay que declararla 
% dentro de las funciones que la van a modificar


function answer=makeTruthTable(n, problem)
    global table;
    table = zeros(2^n, n+1);
	
    if n>=2 && n <=5
            level=2^n;
            %if(strcmp(problem,'or') == 1)
            %    table=-1*ones(level,n+1);
            %elseif(strcmp(problem,'and') == 1)
            %    table=ones(level,n+1);
            %else
            %    error('func must be ''and'' or ''or''');
            %end    
            complete(level,n,problem);
	else
		error('n must be a value between 2 and 5');
    end
    if(strcmp(problem,'parity') == 1)
       for i=1:2^n
          count = 0;
          for j=1:n
              if table(i,j) == 1
                  count = count + 1;
              end    
          end
          if mod(count,2) == 0
              table(i, n+1) = 1;
          else
              table(i, n+1) = -1;
          end    
       end
    elseif(strcmp(problem,'simetry') == 1)
        for i=1:2^n
            simetry = 1;
            for j=1:floor(n/2)
                if(table(i,j) ~= table(i,n+1-j))
                    table(i,n+1) = -1;
                    simetry = 0;
                end
            end
            if(simetry == 1)
                table(i,n+1) = 1;
            end
        end    
    else
        error('problem must be ''parity'' or ''simetry''');
    end
    answer = table;
end

	
function complete(level,n,problem)
	recu(1,level,1,0);
	%evaluate(level,n,problem);
end

function recu(val,l,i,j)
    global table;
	
    if l==1
		table(i,j)=val;
	else
		nextl=l/2;
		recu(val,nextl,i,j+1);
		recu(-val,nextl,i+nextl,j+1);
		completecolumn(val,l,i,j);	
    end
end

function completecolumn(val,l,i,j)
    global table;
	
    if j~=0
		table(i,j)=val;
    end
    
    if l>1
		completecolumn(val,l-1,i+1,j);
    end
end

%function evaluate(level,n,problem)
%	global table;
%	
%    for i=1:level
%		
%        for  j=1:n
%			
%            if(strcmp(problem, 'or') == 1)
%                if table(i,j)==1
%                    table(i,n+1)=1;
%                end    
%            else
%                if table(i,j)==-1
%                    table(i,n+1)=-1;
%                end
%            end
%        end
%    end
%end
